import dayjs from 'dayjs';
import advancedFormat from 'dayjs/plugin/advancedFormat';
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
import relativeTime from 'dayjs/plugin/relativeTime';

dayjs.extend(relativeTime);
dayjs.extend(isSameOrBefore);
dayjs.extend(isSameOrAfter);
dayjs.extend(advancedFormat);

export const DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss';

export function format(date?: dayjs.ConfigType, formatStr: string = DATE_FORMAT) {
  return date ? dayjs(date).format(formatStr) : '';
}

export function fromNow(date?: dayjs.ConfigType) {
  return date ? dayjs(date).fromNow() : '';
}

export function parse(date?: dayjs.ConfigType) {
  return date ? dayjs(date) : dayjs();
}

export function isBefore(a: dayjs.ConfigType, b: dayjs.ConfigType) {
  return dayjs(a).isBefore(dayjs(b));
}

export function isAfter(a: dayjs.ConfigType, b: dayjs.ConfigType) {
  return dayjs(a).isAfter(dayjs(b));
}

export function add(date: dayjs.ConfigType, amount: number, unit: dayjs.ManipulateType) {
  return dayjs(date).add(amount, unit);
}

export function diff(a: dayjs.ConfigType, b: dayjs.ConfigType, unit?: dayjs.OpUnitType) {
  return dayjs(a).diff(dayjs(b), unit as any);
}

export default { dayjs, format, fromNow, parse, isBefore, isAfter, add, diff };
